home *** CD-ROM | disk | FTP | other *** search
- /* ==========================================================================
- **
- ** PObject.c
- **
- ** ⌐1991 WILLISoft
- **
- ** ==========================================================================
- */
-
- #include <exec/types.h>
- #include "PObject.h"
- #include "PObjectClass.h"
- #include "stdlib.h"
- #include "AmigaMem.h"
-
- void SetObjectName( PObject *self, char *name );
-
- #ifdef VERBOSE
- void DumpClassChain( struct PObjectClass *class )
- {
- for( ; class!=NULL; class=class->isa )
- {
- printf("%s", class->ClassName );
- if (class->isa) printf("->");
- }
- printf("\n");
- }
- #endif
-
-
- void PObject_CleanUp( PObject *self )
- {
- SetObjectName( self, NULL );
- }
-
-
-
- void CleanUp( PObject *self )
- {
- struct PObjectClass *class;
- void *prev_cleaner = NULL;
-
-
- if (self)
- {
- /* call cleanup routines for entire parent hierarchy. */
- for (class = (struct PObjectClass *) self->isa;
- class != NULL;
- class = class->isa )
- {
- if (class->CleanUp)
- {
- if ((void*) class->CleanUp != prev_cleaner)
- {
- (*class->CleanUp)( self );
- prev_cleaner = (void*) class->CleanUp;
- }
- }
- }
- }
- }
-
-
- const char *ClassName( const PObject *self )
- {
- struct PObjectClass *class;
- char *name = NULL;
-
- if (self)
- if (class = (struct PObjectClass *) self->isa)
- name = class->ClassName;
-
- return name;
- }
-
- BOOL isa( const PObject *self,
- const Class *class )
- {
- struct PObjectClass *self_class;
- struct PObjectClass *c;
-
- c = (struct PObjectClass *) class;
- if (self)
- {
- /* Traverse inheritence tree of self. */
- for ( self_class = self->isa;
- self_class != NULL;
- self_class = self_class->isa )
- {
- /*printf("isa(\"%s\", \"%s\")\n",*/
- /* self_class->ClassName, c->ClassName );*/
- if (self_class->ClassName == c->ClassName)
- {
- /*printf("Match!\n");*/
- return TRUE;
- } }
- }
-
- /*printf("No Match.\n");*/
- return FALSE;
- }
-
-
- char *ObjectName( PObject *self )
- {
- if (self) return self->PObjectName;
- return NULL;
- }
-
- char *PObjectName( PObject *self ) { return ObjectName(self); }
-
- void SetObjectName( PObject *self, char *name )
- {
- if (self == NULL) return;
-
- Afree( self->PObjectName );
- self->PObjectName = Astrdup(name);
- }
-
- BOOL PObject_elaborated = FALSE;
-
- struct PObjectClass PObject_Class;
-
- void PObjectClass_Init( struct PObjectClass *class )
- {
- class->isa = NULL;
- class->ClassName = "PObject";
- class->CleanUp = PObject_CleanUp;
- }
-
-
- const struct PObjectClass *PObjectClass( void )
- {
- if (! PObject_elaborated)
- {
- PObjectClass_Init( &PObject_Class );
- PObject_elaborated = TRUE;
- }
-
- return &PObject_Class;
- }
-
- void PObject_Init( PObject *self )
- {
- self->isa = PObjectClass();
- self->PObjectName = NULL;
- }
-